// JavaScript Document


function Validate(){}

// các hàm thao tác chuỗi
Validate.prototype.trim = function(string)
{
	var s = new String(string);
	if(s.length==0) return "";
	
	var begin, end;
	for(begin=0; begin<s.length; begin++)
		if(s[begin]!=' ') break;
	if(begin>=s.length) return "";
	
	for(end=s.length-1; end>=0; end--)
		if(s[end]!=' ') break;	
	s = s.substr(begin, end-begin+1);
	return s.valueOf();
}

Validate.prototype.trim2 = function(string)
{
	var check = /^\s*(\S*|\S+[\s\S]*\S+)\s*$/i;
	var kq = check.exec(string);
	if(kq == null) return "";
	return kq[1];
}

Validate.prototype.replaceAllSpace = function(string)
{
	var reg = /\s*/g;
	return string.replace(reg, "");
}
// end các hàm thao tác chuỗi

// kiểm tra chuỗi chỉ bao gồm chữ cái, chữ số và khoảng trắng
Validate.prototype.isOnlyAlphaNumericSpace = function(string)
{
	var invalidCheck = /[^a-z\d ]/i;
	return !invalidCheck.test(string);
}

// kiểm tra chuỗi chỉ bao gồm chữ cái, chữ số
Validate.prototype.isOnlyAlphaNumeric = function(string)
{
	var invalidCheck = /[^a-z\d]/i;
	return !invalidCheck.test(string);
}

// kiểm tra chuỗi chỉ bao gồm chữ cái và khoảng trắng
Validate.prototype.isOnlyAlphaSpace = function(string)
{
	var invalidCheck = /[^a-z ]/i;
	return !invalidCheck.test(string);
}


Validate.prototype.isValidEmail = function(email)
{
	var check = /^\w+(\.\w+)*@\w+(\.\w+)*\.[a-z]{2,4}$/i;
	//  /^\w(\.?[\w-])*@\w(\.?[\w-])*\.[a-z]{2,4}$/i;
	return check.test(email);
}

Validate.prototype.isValidDate = function(string)
{
	var d = new Date(string);
	if(isNaN(d)) return null;
	return d;
}

// month là viết tắt tháng/viết đầy đủ tháng bằng tiếng anh hoặc số từ 1 đến 12
Validate.prototype.isValidDate2 = function(day, month, year)
{
	var months = new Array("jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec");
	var so = Number(month);
	if(!isNaN(so))
	{
		var toint = parseInt(month);
		if(toint==so && 1<=so && so<=12)
			month = months[so-1];
		else return null;
	}
	
	var d = new Date(day+" "+month+" "+ year);
	if(isNaN(d)) return null;
	if(d.getDate()!=day || d.getFullYear()!=parseInt(year)) return null;
	return d;
}

Validate.prototype.isValidDateOfBirth = function(day, month, year)
{
	var ngay = this.isValidDate2(day, month, year);
	if(ngay==null) return null;
	var today = new Date();
	if(today.getFullYear()-ngay.getFullYear()>140 || today<ngay) return null;
	return ngay;
}

// month : 1->12
Validate.prototype.isValidCreditCardExpiry = function(month, year)
{
	var today = new Date();
	if((today.getFullYear()==year && month<=today.getMonth())||today.getFullYear()>year)
		return false;
	return true;
}

Validate.prototype.isValidCreditCardNumber = function(cardNumber, cardType)
{
	cardNumber = this.replaceAllSpace(cardNumber);
	cardNumber = cardNumber.replace(/-*/g, "");
	// xong, cardNumber chỉ còn được phép có các con số
	var check = /[^\d]/;
	if(!check.test(cardNumber))
	{
		var leng = cardNumber.length;
		var reg;
		switch(cardType)
		{
			case "mastercard":
				if(leng!=16) return false;
				reg = /^5[4-5]/; break;
			case "visa":
				if(leng!=16 && leng!=13) return false;
				reg = /^4/; break;
			case "amex":
				if(leng!=15) return false;
				reg = /^3(4|7)/; break;
			default:
				return false;
		}
		if(!reg.test(cardNumber)) return false;
		
		var numProduct, numProductDigitIndex, checkSum;
		checkSum = 0;
		for(digitCounter = leng-1; digitCounter>=0; digitCounter--)
		{
			checkSum += parseInt(cardNumber.charAt(digitCounter));
			if(digitCounter>0)
			{
				digitCounter--;
				numProduct = String(cardNumber.charAt(digitCounter)*2);
				for(var count=0; count<numProduct.length; count++)
					checkSum += parseInt(numProduct.charAt(count));
			}
		}
		if(checkSum%10 != 0) return false;
	}
	return true;
}

Validate.prototype.checkFormValid = function(theForm, theDocument)
{
	var formOK = true;
	var ok;
	var element, elementName, errorDivId;
	var canDuocKiemTraReg = /(_compulsory|_notCompulsory)/i;
	var batBuocPhaiCoReg = /(_compulsory)/i;
	var kieuDuLieuReg = /_[a-z]+$/i;
	
	for(var i=0; i<theForm.length; i++)
	{
		ok = true;
		element = theForm.elements[i];
		elementName = element.name;
		if(canDuocKiemTraReg.test(elementName))
		{
			errorDivId = elementName.slice(3, elementName.indexOf("_"))+"Error";
			this.hideErrorDiv(errorDivId, theDocument);
			
			if(element.type=="text" || element.type=="password"  || element.type=="file")
			{
				ok = this.isTextElementValid(element, kieuDuLieuReg, batBuocPhaiCoReg.test(elementName));
			}else if(element.type=="radio")
			{
				if(batBuocPhaiCoReg.test(elementName))
				{
					element = theForm.elements[elementName];
					ok = this.isOneRadioButtonGroupSelected(element);
				}
			}
			
			if(!ok)
			{
				formOK = false;
				this.showErrorDiv(errorDivId, theDocument);
			}
		}
		i++;
		while(i<theForm.length && theForm.elements[i].name==elementName) i++;
		i--;
	}
	return formOK;
}

Validate.prototype.isTextElementValid = function(element, kieuDuLieuReg, batBuocPhaiCo)
{
	var chuoi = this.trim2(element.value);
	if(batBuocPhaiCo && chuoi=="")
		return false;
	if(batBuocPhaiCo==false && chuoi=="")
		return true;
	var dataType = kieuDuLieuReg.exec(element.name)[0];
	dataType = dataType.toLowerCase();
	if(dataType!="_compulsory" && dataType!="_notCompulsory")
		return this.isElementDataValid(chuoi, dataType);
	return true;
}

Validate.prototype.isElementDataValid = function(elementValue, dataType)
{
	var isValid = false;
	switch(dataType)
	{
		case "_alphanumeric":
			isValid = this.isOnlyAlphaNumericSpace(elementValue); break;
		case "_alphanumericnospace":
			isValid = this.isOnlyAlphaNumeric(elementValue); break;
		case "_alphabetic":
			isValid = this.isOnlyAlphaSpace(elementValue); break;
		case "_numeric":
			isValid = this.isOnlyNumberic(elementValue); break;
		case "_integer":
			isValid = this.isValidInteger(elementValue); break;
		case "_floatingpoint":
			isValid = this.isFloatPoint(elementValue); break;
		case "_age":
			isValid = this.isValidAge(elementValue); break;
		case "_password":
			isValid = this.isValidPasswordCharacters(elementValue); break;
		case "_telephone":
			isValid = this.isValidTelephoneNum(elementValue); break;
		case "_postcode":
			isValid = this.isValidPostalCode(elementValue); break;
		case "_email":
			isValid = this.isValidEmail(elementValue); break;
		default:
			alert("Kiểu dữ liệu "+dataType+" hiện không được hỗ trợ !");
	}
	return isValid;
}

Validate.prototype.isOneRadioButtonGroupSelected = function(element)
{
	var isValid = false;
	for(var i=0; i<element.length; i++)
		if(element[i].checked)
		{
			isValid = true; break;
		}
	return isValid;
}






// hàm chuyển chuỗi value thành int
// trả lại 
// null nếu chuỗi là chuỗi toàn khoảng trắng
// NaN nếu value không phải int hợp lệ
// giá trị số nếu đó là int hợp lệ
Validate.prototype.parseToInt = function(value)
{
	if(this.trim2(value).length==0) return null; 
	
	var toNum = Number(value);
	if(isNaN(toNum)) return toNum;
	var toInt = parseInt(value);
	if(isNaN(toInt) || toInt!=toNum) return Number.NaN; 
	return toInt;
}

// hàm chuyển chuỗi value thành float
// trả lại 
// null nếu chuỗi là chuỗi toàn khoảng trắng
// NaN nếu value không phải float hợp lệ
// giá trị số nếu đó là float hợp lệ
Validate.prototype.parseToFloat = function (value)
{
	if(this.trim2(value).length==0) return null; 
	return Number(value);
}


Validate.prototype._required_ok = function(the)
{
	var gt =  this.trim2(the.value);
	return (gt!="");
}


Validate.prototype._required_allow_space_ok = function(the)
{
	return (the.value!="");
}

Validate.prototype._is_integer_ok = function(the)
{
	var kq = this.parseToInt(the.value);
	return !isNaN(kq);
}

Validate.prototype._is_float_ok = function(the)
{
	var kq = this.parseToFloat(the.value);
	return !isNaN(kq);
}

Validate.prototype._min_value_ok = function(the, m_value)
{
	var kq = this.parseToFloat(the.value);
	return (kq==null || (!isNaN(kq) && kq>=m_value));
}

Validate.prototype._max_value_ok = function(the, m_value)
{
	var kq = this.parseToFloat(the.value);
	return (kq==null || (!isNaN(kq) && kq<=m_value));
}

Validate.prototype._is_integer_greater_than_0_ok = function(the)
{
	var kq = this.parseToInt(the.value);
	return (kq==null || (!isNaN(kq) && kq>0));
}

Validate.prototype._is_integer_greater_or_equal_0_ok = function(the)
{
	var kq = this.parseToInt(the.value);
	return (kq==null || (!isNaN(kq) && kq>=0));
}

Validate.prototype._is_float_greater_than_0_ok = function(the)
{
	var kq = this.parseToFloat(the.value);
	return (kq==null || (!isNaN(kq) && kq>0));
}

Validate.prototype._is_float_greater_or_equal_0_ok = function(the)
{
	return this._min_value_ok(the, 0);
}

Validate.prototype._max_length_ok = function(the, m_value)
{
	var gt =  this.trim2(the.value);
	return (gt.length==0 || gt.length<=m_value);
}

Validate.prototype._min_length_ok = function(the, m_value)
{
	var gt =  this.trim2(the.value);
	return (gt.length==0 || gt.length>=m_value);
}

Validate.prototype._max_length_allow_space_ok = function(the, m_value)
{
	var gt =  the.value;
	return (gt.length==0 || gt.length<=m_value);
}

Validate.prototype._min_length_allow_space_ok = function(the, m_value)
{
	var gt =  the.value;
	return (gt.length==0 || gt.length>=m_value);
}

Validate.prototype._only_number_ok = function(the)
{
	var check = /^\s*\d*\s*$/;
	return check.test(the.value);
}

Validate.prototype._only_number_no_space_ok = function(the)
{
	var check = /^\d*$/;
	return check.test(the.value);
}

Validate.prototype._only_number_and_space_ok = function(the)
{
	var check = /^[ \d]*$/;
	return check.test(the.value);
}

Validate.prototype._is_email_ok = function(the)
{
	var gt =  this.trim2(the.value);
	return (gt.length==0 || this.isValidEmail(gt));
}

Validate.prototype._is_phone_number_ok = function(the)
{
	var gt =  this.trim2(the.value);
	if(gt.length==0) return true;
	var reg = /[-\s]*/g;
	gt = gt.replace(reg, "");
	var check = /^\d*$/;
	return(gt.length>=6 && check.test(gt));
}

Validate.prototype._doc_ngay_thang_nam = function(the, thuocTinh)
{
	var gt =  this.trim2(the.value);
	if(gt.length==0) return null;
	
	var kq;
	kq = gt.split("/");
	if(kq.length != 3){
		kq = gt.split("-");
	}
	if(kq.length != 3){
		kq = gt.split(".");
	}
	if(kq.length != 3){
		kq = gt.split(",");
	}
	
	var batDau = 0;
	if(kq.length != 3)
	{
		var reg;
		if( thuocTinh == "_dd_mm_yyyy"){
			reg = /^\s*(\d+)\s+(\d+|[a-zA-Z]+)\s+(\d+)\s*$/;
		}else{
			reg = /^\s*(\d+|[a-zA-Z]+)\s+(\d+)\s+(\d+)\s*$/;
		}
		kq = reg.exec(gt);
		if(kq == null) return null;
		if(kq.length !=4 ) return null;
		batDau = 1;
	}
	
	var day, month, year;
	if( thuocTinh == "_dd_mm_yyyy"){
		day = kq[batDau+0];
		month = kq[batDau+1];
	}else{
		day = kq[batDau+1];
		month = kq[batDau+0];
	}
	year = kq[batDau+2];
	day = this.trim2(day);
	month = this.trim2(month);
	year = this.trim2(year);
	if(day.length==0 || month.length==0 || year.length==0) return null;
	
	day = Number(day);
	year = Number(year);
	if(isNaN(day) || isNaN(year)) return null;
	if(parseInt(day) != day || parseInt(year) != year) return null;
	if(day<1 || day>31 || year<1800) return null;
	
	return this.isValidDate2(day, month, year);
}

Validate.prototype._is_ngay_thang_nam_ok = function(the, thuocTinh)
{
	if(!this._required_ok(the)) return true;
	return (this._doc_ngay_thang_nam(the, thuocTinh)!=null);
}

Validate.prototype.DispalyInVND = function(num) {
    var laSoAm = false;
    if (num < 0) {
        num = -num;
        laSoAm = true;
    }
    num = new String(num);
    var last = num.lastIndexOf(".");
    var result = "";
    if (last < 0) {
        last = num.length;
    } else {
        result = num.substr(last);
    }
    // tiến hành chèn dấu phẩy vào
    last -= 3;
    while (last > 0) {
        result = "," + num.substr(last, 3) + result;
        last -= 3;
    }
    last += 3;
    if (last > 0) {
        result = num.substr(0, last) + result;
    }
    if (laSoAm) {
        result = "-" + result;
    }
    return result;
}

Validate.prototype.ganLabel = function(idLabel, id_Nut) {
    var $label = $("#" + idLabel);
    var $nut = $("#" + id_Nut);
    $label.click(function (e) {
        $nut.click();
    });
}



// ẩn đi ko dùng nữa
//// code here
//var validate = new Validate();








//function MyHide(id)
//{
//	if(id != null)
//	{
//		var $the = $("#" + id);
//		$the.html("");
//		$the.hide();
//	}
//}

//function MyShow(id, message)
//{
//	if(id != null)
//	{
//		var $the = $("#" + id);
//		$the.html(message);
//		$the.show();
//	}
//}

//// truyền vào thẻ là đối tượng DOM
//// trả về null nếu không có lỗi, ngược lại trả về chuỗi lỗi
//function KiemTraThe(the)
//{
//	var dsThuocTinh = the.attributes;
//	for(var i=0; i<dsThuocTinh.length; i++)
//	{
//		var thuocTinh = dsThuocTinh[i];
//		switch(thuocTinh.name)
//		{
//			case "_required":
//				if(!validate._required_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_required_allow_space":
//				if(!validate._required_allow_space_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_is_integer":
//				if(!validate._is_integer_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_is_float":
//				if(!validate._is_float_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_min_value":
//				var m = thuocTinh.value.split("|");
//				if(m.length==2)
//				{
//					var m_value = Number(m[0]);
//					if(!isNaN(m_value) && !validate._min_value_ok(the, m_value)){
//						return m[1];
//					}
//				}
//				break;
//			case "_max_value":
//				var m = thuocTinh.value.split("|");
//				if(m.length==2)
//				{
//					var m_value = Number(m[0]);
//					if(!isNaN(m_value) && !validate._max_value_ok(the, m_value)){
//						return m[1];
//					}
//				}
//				break;
//			case "_is_integer_greater_than_0":
//				if(!validate._is_integer_greater_than_0_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_is_integer_greater_or_equal_0":
//				if(!validate._is_integer_greater_or_equal_0_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_is_float_greater_than_0":
//				if(!validate._is_float_greater_than_0_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_is_float_greater_or_equal_0":
//				if(!validate._is_float_greater_or_equal_0_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_max_length":
//				var m = thuocTinh.value.split("|");
//				if(m.length==2)
//				{
//					var m_value = parseInt(m[0]);
//					if(!isNaN(m_value) && !validate._max_length_ok(the, m_value)){
//						return m[1];
//					}
//				}
//				break;
//			case "_min_length":
//				var m = thuocTinh.value.split("|");
//				if(m.length==2)
//				{
//					var m_value = parseInt(m[0]);
//					if(!isNaN(m_value) && !validate._min_length_ok(the, m_value)){
//						return m[1];
//					}
//				}
//				break;
//			case "_max_length_allow_space":
//				var m = thuocTinh.value.split("|");
//				if(m.length==2)
//				{
//					var m_value = parseInt(m[0]);
//					if(!isNaN(m_value) && !validate._max_length_allow_space_ok(the, m_value)){
//						return m[1];
//					}
//				}
//				break;
//			case "_min_length_allow_space":
//				var m = thuocTinh.value.split("|");
//				if(m.length==2)
//				{
//					var m_value = parseInt(m[0]);
//					if(!isNaN(m_value) && !validate._min_length_allow_space_ok(the, m_value)){
//						return m[1];
//					}
//				}
//				break;
//			case "_only_number":
//				if(!validate._only_number_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_only_number_no_space":
//				if(!validate._only_number_no_space_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_only_number_and_space":
//				if(!validate._only_number_and_space_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_is_email":
//				if(!validate._is_email_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_is_phone_number":
//				if(!validate._is_phone_number_ok(the)){
//					return thuocTinh.value;
//				}
//				break;
//			case "_dd_mm_yyyy":
//			case "_mm_dd_yyyy":
//				if(!validate._is_ngay_thang_nam_ok(the, thuocTinh.name)){
//					return thuocTinh.value;
//				}
//				break;
//		}
//	}
//	return null; // ko có lỗi !
//}

//function HamOnChange(the)
//{
//	var id = null;
//	if($(the).attr("_error_box")){
//		id = $(the).attr("_error_box");
//	}
//	
//	var kq = KiemTraThe(the);
//	if(kq == null){
//		MyHide(id);
//	}else{
//		MyShow(id, kq);
//	}
//	return kq;
//}

//function HamXuLyOnChange(e)
//{
//	HamOnChange(this);
//}

//function HamXuLyOnSubmitForm(e)
//{
//	var $form = $(this);
//	
//	var the_id = $form.attr("id");
//	var chuoi = "";
//	$("#"+ the_id+ " input[_need_check]").each(function(index, element) {
//        var $the = $(this);
//		if($the.attr("_need_check").toLowerCase()=="true")
//		{
//			var kiemTra = HamOnChange(this);
//			if(kiemTra!=null) // có lỗi xảy ra
//			{
//				chuoi += "<span>" + kiemTra + "</span><br />";
//			}
//		}
//    });
//	
//	if(chuoi!=""){
//		chuoi = chuoi.substr(0, chuoi.length-6); // loại bỏ <br /> cuối cùng
//	}
//	if($form.attr("_error_box"))
//	{
//		var id = $form.attr("_error_box");
//		if(chuoi == ""){
//			MyHide(id);
//		}else{
//			MyShow(id, chuoi);
//		}
//	}
//	if(chuoi!="")// có lỗi xảy ra
//	{
//		return false;
//	}
//	return true;
//}


//$(document).ready(function(e) {
//    // tiến hành duyệt qua các form, nếu form nào có đăng ký kiểm tra thì add hàm xử lý
//	// vào sự kiện submit của form và vào sự kiện onchange của các thẻ input nào có đăng ký
//	$("form[_need_check]").each(function(index, element) {
//        var $form = $(this);
//		var need_check = false;
//		if($form.attr("_need_check").toLowerCase()=="true")
//		{
//			var the_id = $form.attr("id");
//			$("#"+ the_id+ " input[_need_check]").each(function(index, element) {
//                var $the = $(this);
//				if($the.attr("_need_check").toLowerCase()=="true")
//				{
//					need_check = true;
//					$the.change(HamXuLyOnChange); // đăng ký hàm xử lý
//				}
//            });
//		}
//		if(need_check){
//			$form.submit(HamXuLyOnSubmitForm)
//		}
//    });
//	
//	// tiến hành duyệt để gắn nhãn cho các thẻ input là radio hay check box
//	$("(:radio,:checkbox)[_add_label]").each(function(index, element) {
//        var $the = $(this);
//		var $label = $("#" + $the.attr("_add_label"));
//		if($label && $label.length && $label.length>0){
//			$label.click(function(e) {
//                if($the.attr("type")=="checkbox"){
//					$the.attr("checked", !$the.attr("checked")) ;
//				}else{
//					$the.attr("checked", true);
//				}
//            });
//		}
//    });
//});


